package upload

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"path/filepath"
	"server/utils"
	"strings"
	"time"

	"github.com/gin-gonic/gin"
)

// UploadImage 上传图片
func UploadImage(c *gin.Context) {
	file, err := c.FormFile("file")
	if err != nil {
		utils.JSONResponse(c, http.StatusBadRequest, fmt.Sprintf("获取文件失败: %v", err), nil)
		return
	}
	// 检查文件格式与大小
	ext := strings.ToLower(filepath.Ext(file.Filename))
	if !strings.Contains(".jpg.jpeg.png.gif", ext) {
		utils.JSONResponse(c, http.StatusBadRequest, "仅支持 jpg, jpeg, png, gif 格式的图片", nil)
		return
	}
	if file.Size > 1024*1024*20 {
		utils.JSONResponse(c, http.StatusBadRequest, "文件大小不能超过20MB", nil)
		return
	}
	// 生成唯一文件名并保存
	uniqueName := fmt.Sprintf("%d%s", time.Now().UnixNano(), ext)
	saveDir := "static/image"
	if _, err := os.Stat(saveDir); os.IsNotExist(err) {
		if err := os.MkdirAll(saveDir, 0755); err != nil {
			utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("创建目录失败: %v", err), nil)
			return
		}
	}
	filePath := filepath.Join(saveDir, uniqueName)
	src, err := file.Open()
	if err != nil {
		utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("打开上传文件失败: %v", err), nil)
		return
	}
	defer src.Close()
	dst, err := os.Create(filePath)
	if err != nil {
		utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("创建保存文件失败: %v", err), nil)
		return
	}
	defer dst.Close()
	if _, err := io.Copy(dst, src); err != nil {
		utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("保存文件失败: %v", err), nil)
		return
	}
	utils.JSONResponse(c, http.StatusOK, "图片上传成功", gin.H{
		"file_name": file.Filename,
		"file-size": fmt.Sprintf("%.2f MB", float64(file.Size)/(1024*1024)),
		"file_type": file.Header.Get("Content-Type"),
		"file_path": filePath,
	})
}

// UploadFile 上传文件
func UploadFile(c *gin.Context) {
	file, err := c.FormFile("file")
	if err != nil {
		utils.JSONResponse(c, http.StatusBadRequest, fmt.Sprintf("获取文件失败: %v", err), nil)
		return
	}
	if file.Size > 1024*1024*100 {
		utils.JSONResponse(c, http.StatusBadRequest, "文件大小不能超过100MB", nil)
		return
	}
	ext := strings.ToLower(filepath.Ext(file.Filename))
	uniqueName := fmt.Sprintf("%d%s", time.Now().UnixNano(), ext)
	saveDir := "static/file"
	if _, err := os.Stat(saveDir); os.IsNotExist(err) {
		if err := os.MkdirAll(saveDir, 0755); err != nil {
			utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("创建目录失败: %v", err), nil)
			return
		}
	}
	filePath := filepath.Join(saveDir, uniqueName)
	src, err := file.Open()
	if err != nil {
		utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("打开上传文件失败: %v", err), nil)
		return
	}
	defer src.Close()
	dst, err := os.Create(filePath)
	if err != nil {
		utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("创建保存文件失败: %v", err), nil)
		return
	}
	defer dst.Close()
	if _, err := io.Copy(dst, src); err != nil {
		utils.JSONResponse(c, http.StatusInternalServerError, fmt.Sprintf("保存文件失败: %v", err), nil)
		return
	}
	utils.JSONResponse(c, http.StatusOK, "文件上传成功", gin.H{
		"file_name": file.Filename,
		"file_size": fmt.Sprintf("%.2f MB", float64(file.Size)/(1024*1024)),
		"file_type": file.Header.Get("Content-Type"),
		"file_path": filePath,
	})
}


